package org.xxpay.core.service;

import org.xxpay.core.common.domain.api.msg.QueryRetMsg;
import org.xxpay.core.entity.MchAgentpayRecord;
import org.xxpay.core.entity.TransOrder;

import java.util.List;

/**
 * @author: dingzhiwei
 * @date: 2018/5/29
 * @description: 代付接口
 */
public interface IXxPayAgentpayService {

    /** 函数重载 **/
    void apply(MchAgentpayRecord record);

    /**
     * 发起代付业务（供给：商户代付API接口 & 商户系统代付申请 & 商户系统批量代付申请）
     * 1. 验证商户余额是否充足；
     * 2. 插入 agentPayRecord  和 transOrder记录， 以及冻结商户账户余额；
     * 异步线程处理 3 - 4：
     * 3. 调起上游接口；
     * 4. 根据上游返回信息处理是否回调下游接口，以及更新表记录。
     * **/
    void apply(List<MchAgentpayRecord> recordList);

    /** 发起代付业务（供给： 运营平台打款审核发起的转账业务） **/
    String applyBySett(TransOrder transOrder);

    /**
     * 调起上游api接口， 并根据返回信息更新对应记录
     *  1. 根据transOrder信息调起上游支付接口
     * **/
    void executeChannelAPI(TransOrder transOrder);

    /**
     * 查询上游结果 & 处理订单状态
     * @param transOrder
     */
    boolean queryChannelAndProcessOrderState(TransOrder transOrder);

    /**
     * 处理代付订单状态
     * @param transOrder 转账订单
     * @param retMsg 实际代付接口的返回结果
     */
    boolean processOrderState(TransOrder transOrder, QueryRetMsg retMsg);

    /** choosePayType: 打款方式
     * value="1" title="选择一种代付通道/银行卡"
     * value="2" title="选择多张银行卡累加打款">
     * value="3" title="其他支付方式">
     *
     * **/
   void auditOk(MchAgentpayRecord record, Integer choosePayType);

   void auditReject(MchAgentpayRecord record, Byte recordOldStatus);

    /** 商户二次确认成功的处理逻辑 **/
    void mchConfirmNext(String agentpayOrderId);

    /** 运营平台补单操作 **/
    void doReissue(String agentpayOrderId, QueryRetMsg queryRetMsg, boolean isNotifyMch);

}
